/*
    迭代器：迭代器是一个拥有next()方法的特殊对象，每次调用next()都返回一个结果对象
        
*/
function createIterator(items) {
    var i = 1; 

    return {  // 返回一个迭代器对象
        next: function() {  // 迭代器对象一定有个next()方法
            var done = (i >= items.length);
            var value = !done? items[i++] : undefined;

            return {
                done,
                value,
            };
        },
    };
};


var iterator1 = createIterator([1,2,3]);
console.log(iterator1.next());  // "{ value: 1, done: false}"
console.log(iterator1.next());  // "{ value: 2, done: false}"
console.log(iterator1.next());  // "{ value: 3, done: false}"
console.log(iterator1.next());  // "{ value: undefiend, done: true}"
// 之后所有的调用都会返回相同内容
console.log(iterator1.next());  // "{ value: undefiend, done: true}"


/*
    生成器： 生成器是一种返回迭代器的函数，通过function关键字后的星号（*）来表示，函数中会用到新的关键字yield
*/

function *createIterator(items) {
    for(let i=0; i<items.length; i++) {
        yield items[i];
    }
}

let iterator2 = createIterator([1, 2, 3]);

// 既然生成器返回的是迭代器，自然就可以调用迭代器的next()方法
console.log(iterator2.next());  // "{ value: 1, done: false}"
console.log(iterator2.next());  // "{ value: 2, done: false}"
console.log(iterator2.next());  // "{ value: 3, done: false}"
console.log(iterator2.next());  // "{ value: undefiend, done: true}"
// 之后所有的调用都会返回相同内容
console.log(iterator2.next());  // "{ value: undefiend, done: true}"

// 生成器的创建方式
// 2.生成器是个函数：
function *createIterator(items) { ... }

// 2.可以用函数表达式方式书写：
let createIterator = function *(item) { ... }

// 3.也可以添加到对象中，ES5风格对象字面量：
let o = {
    createIterator: function *(items) { ... }
};

let iterator = o.createIterator([1, 2, 3]);

// 4. ES6风格的对象方法简写方式：
let o = {
    *createIterator(items) { ... }
};

let iterator = o.createIterator([1, 2, 3]);